// import com.alibaba.druid.sql.ast.statement.SQLTableElement_ptr ;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor*;

// import java.util.ArrayList;
// import java.util.std::list;
#pragma once
#include <string>
#include <list>

#include "SQLObjectImpl.h"
#include "SQLObjectWithDataType.h"
#include "SQLReplaceable.h"
#include "../../utils/common_ptr.h"

class SQLName;
class SQLDataType;
class SQLExpr;
class SQLTableElement;
class SQLObject;

class SQLDeclareItem
    : virtual public SQLObjectImpl,
      virtual public SQLObjectWithDataType,
      virtual public SQLReplaceable
{
public:
  enum Type
  {
    TABLE,
    LOCAL,
    CURSOR
  };

  Type type;

  SQLName_ptr name;

  SQLDataType_ptr dataType;

  SQLExpr_ptr value;

  SQLTableElement_list_ptr tableElementList;

  SQLObject_ptr resolvedObject;

  SQLDeclareItem();

  SQLDeclareItem(SQLName_ptr name, SQLDataType_ptr dataType);

  SQLDeclareItem(SQLName_ptr name, SQLDataType_ptr dataType, SQLExpr_ptr value);
  SHAREDOBJECT(SQLDeclareItem);
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  void accept0(SQLASTVisitor_ptr visitor);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  SQLDataType_ptr getDataType();

  void setDataType(SQLDataType_ptr dataType);

  SQLExpr_ptr getValue();

  void setValue(SQLExpr_ptr value);

  SQLTableElement_list_ptr getTableElementList();

  void setTableElementList(SQLTableElement_list_ptr tableElementList);

  Type getType();

  void setType(Type type);

  SQLObject_ptr getResolvedObject();

  void setResolvedObject(SQLObject_ptr resolvedObject);
};
